home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr34 / blowpas.zip / BLOWFISH.C < prev    next >
Text File  |  1994-10-31  |  18KB  |  575 lines

  1. Path: sus.edu.eur.nl!eur.nl!news.nic.surfnet.nl!sun4nl!EU.net!uunet!spool.mu.edu!agate!darkstar.UCSC.EDU!news.hal.COM!decwrl!waikato!auckland.ac.nz!news
  2. From: schneier@chinet.chinet.com (Bruce Schneier)
  3. Newsgroups: sci.crypt.research
  4. Subject: BLOWFISH: New Source Code Version Available
  5. Date: 30 Oct 1994 11:27:27 GMT
  6. Organization: Chinet - Public Access UNIX
  7. Lines: 559
  8. Sender: crypt-submission@cs.aukuni.ac.nz (sci.crypt.research co-moderator)
  9. Approved: crypt-submission@cs.aukuni.ac.nz
  10. Message-ID: <38vvuv$e8u@net.auckland.ac.nz>
  11. Reply-To: schneier@chinet.chinet.com (Bruce Schneier)
  12. NNTP-Posting-Host: cs13.cs.aukuni.ac.nz
  13. X-Newsreader: NN version 6.5.0 #7 (NOV)
  14.  
  15.  
  16.  
  17.  
  18. /*********************blowfish.h********************/
  19.  
  20. /* $Id: blowfish.h,v 1.2 1994/09/22 04:28:43 cj Exp cj $*/
  21.  
  22. #define MAXKEYBYTES 56          /* 448 bits */
  23. #define bf_N             16
  24. #define noErr            0
  25. #define DATAERROR         -1
  26. #define KEYBYTES         8
  27. #define subkeyfilename   "Blowfish.dat"
  28.  
  29.  
  30. #define UWORD_32bits  unsigned long
  31. #define UWORD_16bits  unsigned short
  32. #define UBYTE_08bits  unsigned char
  33.  
  34. /* choose a byte order for your hardware */
  35. /* ABCD - big endian - motorola */
  36. #ifdef ORDER_ABCD
  37. union aword {
  38.   UWORD_32bits word;
  39.   UBYTE_08bits byte [4];
  40.   struct {
  41.     unsigned int byte0:8;
  42.     unsigned int byte1:8;
  43.     unsigned int byte2:8;
  44.     unsigned int byte3:8;
  45.   } w;
  46. };
  47. #endif  /* ORDER_ABCD */
  48.  
  49. /* DCBA - little endian - intel */
  50. #ifdef ORDER_DCBA
  51. union aword {
  52.   UWORD_32bits word;
  53.   UBYTE_08bits byte [4];
  54.   struct {
  55.     unsigned int byte3:8;
  56.     unsigned int byte2:8;
  57.     unsigned int byte1:8;
  58.     unsigned int byte0:8;
  59.   } w;
  60. };
  61. #endif  /* ORDER_DCBA */
  62.  
  63. /* BADC - vax */
  64. #ifdef ORDER_BADC
  65. union aword {
  66.   UWORD_32bits word;
  67.   UBYTE_08bits byte [4];
  68.   struct {
  69.     unsigned int byte1:8;
  70.     unsigned int byte0:8;
  71.     unsigned int byte3:8;
  72.     unsigned int byte2:8;
  73.   } w;
  74. };
  75. #endif  /* ORDER_BADC */
  76.  
  77.  
  78. short opensubkeyfile(void);
  79. unsigned long F(unsigned long x);
  80. void Blowfish_encipher(unsigned long *xl, unsigned long *xr);
  81. void Blowfish_decipher(unsigned long *xl, unsigned long *xr);
  82. short InitializeBlowfish(unsigned char key[], short keybytes);
  83.  
  84.  
  85. /*********************blowfish.c*********************/
  86.  
  87. *** 1.4    1994/10/07 01:59:28
  88. --- blowfish.c  1994/10/11 03:52:57
  89. ***************
  90. *** 33,39 ****
  91.  
  92.   #include "blowfish.h"
  93.  
  94. ! static char rcsid[] = "$Header: /user3/contrib/cj/blowfish02/RCS/blowfish.c,v 1.4 1994/10/07 01:59:28 cj Exp $";
  95.  
  96.                                 /* P-box P-array, S-box  */
  97.   static UWORD_32bits bf_P[bf_N + 2];
  98. --- 33,39 ----
  99.  
  100.   #include "blowfish.h"
  101.  
  102. ! static char rcsid[] = "$Header: /user3/contrib/cj/blowfish02/RCS/blowfish.c,v 1.5 1994/10/11 02:55:47 cj Exp cj $";
  103.  
  104.                                 /* P-box P-array, S-box  */
  105.   static UWORD_32bits bf_P[bf_N + 2];
  106. ***************
  107. *** 82,88 ****
  108.  
  109.   /*   fprintf (stderr, "copy0x%08x shift0x%08x (line %d)\n", temp.w.byte3, d, __LINE__); /* DEBUG */
  110.  
  111. -    /* these aren't the same under gcc */
  112.      /* Exactly which compilers (with version number) don't work? */
  113.   #ifdef BUGGY_COMPILER
  114.      y = bf_S[0][a] + bf_S[1][b];
  115. --- 82,87 ----
  116. ***************
  117. *** 254,260 ****
  118.          temp.w.byte0 = key[j];
  119.          temp.w.byte1 = key[(j+1)%keybytes];
  120.          temp.w.byte2 = key[(j+2)%keybytes];
  121. !        temp.w.byte3 = key[(j+3)%data];
  122.          data = temp.word;
  123.            bf_P[i] = bf_P[i] ^ data;
  124.          j = (j + 4) % keybytes;
  125. --- 253,259 ----
  126.          temp.w.byte0 = key[j];
  127.          temp.w.byte1 = key[(j+1)%keybytes];
  128.          temp.w.byte2 = key[(j+2)%keybytes];
  129. !        temp.w.byte3 = key[(j+3)%keybytes];
  130.          data = temp.word;
  131.            bf_P[i] = bf_P[i] ^ data;
  132.          j = (j + 4) % keybytes;
  133.  
  134.  
  135. /*********************blowfish.c*********************/
  136.  
  137. /* TODO: test with zero length key */
  138. /* TODO: test with a through z as key and plain text */
  139. /* TODO: make this byte order independent */
  140.  
  141.  
  142. #ifdef MSDOS
  143.    #include <dos.h>             /* FIXME: do we need this? */
  144.    #include <graphics.h>        /* FIXME: do we need this? */
  145.    #include <io.h>              /* FIXME: do we need this? */
  146. #endif
  147.  
  148. #include <stdio.h>              /* used for debugging */
  149. #include <stdlib.h>             /* FIXME: do we need this? */
  150. #include <math.h>               /* FIXME: do we need this? */
  151. #include <time.h>               /* FIXME: do we need this? */
  152.  
  153. #ifdef MSDOS
  154.    #include <alloc.h>           /* FIXME: do we need this? */
  155. #endif
  156.  
  157. #include <ctype.h>              /* FIXME: do we need this? */
  158.  
  159. #ifdef MSDOS
  160.    #include <dir.h>             /* FIXME: do we need this? */
  161.    #include <bios.h>            /* FIXME: do we need this? */
  162. #endif
  163.  
  164. #ifdef MACINTOSH
  165.    #include <Types.h>           /* FIXME: do we need this? */
  166. #endif
  167.  
  168. #include "blowfish.h"
  169.  
  170. static char rcsid[] = "$Header: /user3/contrib/cj/blowfish02/RCS/blowfish.c,v 1.5 1994/10/11 02:55:47 cj Exp cj $";
  171.  
  172.                                 /* P-box P-array, S-box  */
  173. static UWORD_32bits bf_P[bf_N + 2];
  174. static UWORD_32bits bf_S[4][256];
  175. FILE*         SubkeyFile;
  176.  
  177. short opensubkeyfile(void) /* read only */
  178. {
  179.    short error;
  180.  
  181.    error = noErr;
  182.  
  183.    if((SubkeyFile = fopen(subkeyfilename,"rb")) == NULL) {
  184.       error = DATAERROR;
  185.    }
  186.  
  187.    return error;
  188. }
  189.  
  190. UWORD_32bits bf_F(UWORD_32bits x)
  191. {
  192.    unsigned short a;            /* FIXME: unsigned char? */
  193.    unsigned short b;            /* FIXME: unsigned char? */
  194.    unsigned short c;            /* FIXME: unsigned char? */
  195.    unsigned short d;            /* FIXME: unsigned char? */
  196.    UWORD_32bits  y;
  197.  
  198.    union aword temp;
  199.  
  200.    /* TODO: hmmm... are we byte swapping again? */
  201.    temp.word = x;
  202.    d = temp.w.byte3;
  203.    c = temp.w.byte2;
  204.    b = temp.w.byte1;
  205.    a = temp.w.byte0;
  206.  
  207. #ifdef OLD
  208.    d = x & 0x00FF;
  209.    x >>= 8;
  210.    c = x & 0x00FF;
  211.    x >>= 8;
  212.    b = x & 0x00FF;
  213.    x >>= 8;
  214.    a = x & 0x00FF;
  215. #endif /* OLD */
  216.  
  217. /*   fprintf (stderr, "copy0x%08x shift0x%08x (line %d)\n", temp.w.byte3, d, __LINE__); /* DEBUG */
  218.  
  219.    /* Exactly which compilers (with version number) don't work? */
  220. #ifdef BUGGY_COMPILER
  221.    y = bf_S[0][a] + bf_S[1][b];
  222.    y = y ^ bf_S[2][c];
  223.    y = y + bf_S[3][d];
  224. #else
  225.    y = ((bf_S[0][a] + bf_S[1][b]) ^ bf_S[2][c]) + bf_S[3][d];
  226. #endif
  227.  
  228. /*   fprintf (stderr, "0x%08x ", y);*/
  229.  
  230.    return y;
  231. }
  232.  
  233. void Blowfish_encipher(UWORD_32bits *xl, UWORD_32bits *xr)
  234. {
  235.    UWORD_32bits  Xl;
  236.    UWORD_32bits  Xr;
  237.    UWORD_32bits  temp;
  238.    short          i;
  239.  
  240.    Xl = *xl;
  241.    Xr = *xr;
  242.  
  243.    for (i = 0; i < bf_N; ++i) {
  244.       Xl = Xl ^ bf_P[i];
  245.       Xr = bf_F(Xl) ^ Xr;
  246.  
  247.       temp = Xl;
  248.       Xl = Xr;
  249.       Xr = temp;
  250.    }
  251.  
  252.    temp = Xl;
  253.    Xl = Xr;
  254.    Xr = temp;
  255.  
  256.    Xr = Xr ^ bf_P[bf_N];
  257.    Xl = Xl ^ bf_P[bf_N + 1];
  258.  
  259.    *xl = Xl;
  260.    *xr = Xr;
  261. }
  262.  
  263. void Blowfish_decipher(UWORD_32bits *xl, UWORD_32bits *xr)
  264. {
  265.    UWORD_32bits  Xl;
  266.    UWORD_32bits  Xr;
  267.    UWORD_32bits  temp;
  268.    short          i;
  269.  
  270.    Xl = *xl;
  271.    Xr = *xr;
  272.  
  273.    for (i = bf_N + 1; i > 1; --i) {
  274.       Xl = Xl ^ bf_P[i];
  275.       Xr = bf_F(Xl) ^ Xr;
  276.  
  277.       /* Exchange Xl and Xr */
  278.       temp = Xl;
  279.       Xl = Xr;
  280.       Xr = temp;
  281.    }
  282.  
  283.    /* Undo last exchange */
  284.    temp = Xl;
  285.    Xl = Xr;
  286.    Xr = temp;
  287.  
  288.    Xr = Xr ^ bf_P[1];
  289.    Xl = Xl ^ bf_P[0];
  290.  
  291.    *xl = Xl;
  292.    *xr = Xr;
  293. }
  294.  
  295. bf_read_four (fp, buf)
  296.      FILE *fp;
  297.      UWORD_32bits * buf;
  298. {
  299.   int iii;
  300.   int ccc;
  301.   union aword temp;             /* must set byte order ORDER_ABCD, etc */
  302.   union aword swap;
  303.  
  304.   temp.word = *buf;
  305.  
  306. /*  for (iii = 0 ; iii < 4; iii++)
  307.     temp.byte[iii] = '\0'; */
  308.   memset(&temp.word, '\0', 4);
  309.  
  310.   for (iii = 0 ; iii < 4; iii++)
  311.     {
  312.       ccc = fgetc(fp);
  313.  
  314.       if (ccc == EOF)
  315.         break;                  /* should not see EOF when reading subkey */
  316.       temp.byte[iii] = (unsigned)ccc;
  317.     }
  318.  
  319. /*  *buf = temp.word;
  320.   return;
  321. abort();
  322. */
  323.  
  324. #define NEWSWAP
  325. #ifdef NEWSWAP
  326.   swap.w.byte0 = temp.byte[0];
  327.   swap.w.byte1 = temp.byte[1];
  328.   swap.w.byte2 = temp.byte[2];
  329.   swap.w.byte3 = temp.byte[3];
  330.   *buf = swap.word;
  331. #else
  332.  
  333.   *buf = temp.word;
  334.   *buf = ((*buf & 0xFF000000) >> 24) |
  335.          ((*buf & 0x00FF0000) >>  8) |
  336.          ((*buf & 0x0000FF00) <<  8) |
  337.          ((*buf & 0x000000FF) << 24);
  338. #endif  /* NEWSWAP */
  339. /*  return (buf);*/
  340. }
  341.  
  342. /* FIXME: Blowfish_Initialize() ??? */
  343. short InitializeBlowfish(UBYTE_08bits key[], short keybytes)
  344. {
  345.    short          i;            /* FIXME: unsigned int, char? */
  346.    short          j;            /* FIXME: unsigned int, char? */
  347.    short          k;            /* FIXME: unsigned int, char? */
  348.    short          error;
  349.    short          numread;
  350.    UWORD_32bits  data;
  351.    UWORD_32bits  datal;
  352.    UWORD_32bits  datar;
  353.    union aword temp;
  354.  
  355.    /* First, open the file containing the array initialization data */
  356.    error = opensubkeyfile();
  357.  
  358.    if (error) {
  359.      printf("Unable to open subkey initialization file : %d\n", error);
  360.      return error;
  361.    }
  362.  
  363.       for (i = 0; i < bf_N + 2; ++i) {
  364.          data = 0;
  365.          bf_read_four (SubkeyFile, &data);
  366.          bf_P[i] = data;
  367.        }
  368.  
  369. /*   fprintf (stderr, "0x%x 0x%x ", bf_P[0], bf_P[1]);  /* DEBUG */
  370. /*   fprintf (stderr, "%d %d\n", bf_P[0], bf_P[1]);     /* DEBUG */
  371.  
  372.       for (i = 0; i < 4; ++i) {
  373.          for (j = 0; j < 256; ++j) {
  374.            bf_read_four (SubkeyFile, &data);
  375.            bf_S[i][j] = data;
  376.          }
  377.       }
  378.  
  379.       fclose(SubkeyFile);
  380.  
  381.       j = 0;
  382.       for (i = 0; i < bf_N + 2; ++i) {
  383.  
  384. #define NEWCOPY
  385. #ifdef NEWCOPY
  386.          temp.word = 0;
  387.          temp.w.byte0 = key[j];
  388.          temp.w.byte1 = key[(j+1)%keybytes];
  389.          temp.w.byte2 = key[(j+2)%keybytes];
  390.          temp.w.byte3 = key[(j+3)%keybytes];
  391.          data = temp.word;
  392.          bf_P[i] = bf_P[i] ^ data;
  393.          j = (j + 4) % keybytes;
  394. #else
  395.          data = 0x00000000;
  396.          for (k = 0; k < 4; ++k) {
  397.             data = (data << 8) | key[j];
  398.             j = j + 1;
  399.             if (j >= keybytes) {
  400.                j = 0;
  401.            }
  402.          }
  403.          bf_P[i] = bf_P[i] ^ data;
  404. #endif
  405.  
  406. /*       fprintf (stderr, "copy0x%08x shift0x%08x (line %d)\n", temp.word, data, __LINE__); /* DEBUG */
  407.  
  408.       }
  409.  
  410.       datal = 0x00000000;
  411.       datar = 0x00000000;
  412.  
  413.       for (i = 0; i < bf_N + 2; i += 2) {
  414.          Blowfish_encipher(&datal, &datar);
  415.  
  416.          bf_P[i] = datal;
  417.          bf_P[i + 1] = datar;
  418.       }
  419.  
  420.       for (i = 0; i < 4; ++i) {
  421.          for (j = 0; j < 256; j += 2) {
  422.  
  423.             Blowfish_encipher(&datal, &datar);
  424.  
  425.             bf_S[i][j] = datal;
  426.             bf_S[i][j + 1] = datar;
  427.          }
  428.       }
  429.  
  430.    return error;
  431. }
  432.  
  433.  
  434.  
  435. ********************BLOWFISH.DAT.UU********************
  436.  
  437.  
  438. begin 0700 "Blowfish.dat"
  439. Mic]JBhvCbmlsfxHN`WaSqjpinbhIGSgpbb[ZFnQn;hEejbgFnm`s=[YtyL\T
  440. MZpQLPjPIM\E\tmT_AmvUMt<ieYhvU=Fi>?L;TsdkIIC?MzPO_wk;TaK?M[CA
  441. MK^UJiGZvNGRpq?dL?YDDHyEgLYeL]P@a\NjeCOPvxVD@VgewsFFDvoZC]il]
  442. M?@Vu=h]RCKyx<xOmvhhurNY[ujp=PEIyMyPPUsDJ\F`sQ=fPhRA@A?cjpwDx
  443. MNmLX[XYYWka@nA@n;iXnB[`>BC[wew?aOsekiWBOk]IuxeQ@YEtE\ZIuJYqw
  444. MriABx^@tpewjnvHJJQbVMlQ<maeaZlZAuhzO?gkID[oNeaeC;[PJjZGewwpx
  445. Ml?;nwcXvFX>sgJ_vNCmLil]<>Cis@rBuAG<[CTBxzTNYK\r_ZaMFjbfsx=@i
  446. MSoLAJyeh?jQ@w>R`lN^dwuWIAwvQWbxC`NMEfX@CBsZaTYzLQp]M;_nc]dhY
  447. Mk@Md@Jrdh`qIRoajGA^;wBgfzdkVZvRzyPR<xzOsBoaJtzcrVepOzixoIRBK
  448. MtsnC;N\k;amZn^rZn_ap?OLJFjgQyqTYKPeVyLIyoHiccHBl[Hxyqv^?MgVd
  449. MI<l[BUZ^Xf]UVhwahgm`fDr?uLeJID[sJFhVoW<ff_[?<Dj;`CTWTm<DT`Hr
  450. MrmLoZMmi\<b;aUmRRxbyfWLEUgGx]NC>]^o^taJV>tP[EVS@Ops`aKKaJt^V
  451. Mpi]@QeY<GLhyzBqCzoMOKSYLt[tsn;kKnUkL;VW\tq^;litLSheeqj]>OpF^
  452. MX]`dWCmj_vxoj`<ykDNSPlNHuTwh=`_rbU\YN=o[VUuYPkTzxchjUJd`QD`L
  453. M<GEGGRw^^Q^CShZEZ?C;lBkXogtvW_UAzQtOta[hKpurJSh]M?K]hX=@tSe[
  454. MrcX`WXj>we>[RF^lHaJguB[?eVG;UtjH]BA^_\nLySkfCd]u<VE;i[b[RECh
  455. MX?^Cw;CPdz`p^CVx_rfcNdK\MvPMT=m;FEoD>;;XqvwrCDF\r_NwDng=\MJD
  456. MRWXSxOLsp<[DQNCOhlKzmG=l`=a^GOXK\q^TE=OzszZpDyCJKxYQzYouHmbn
  457. MT=bOQRw@CCQ;kXYUEk>o]Nk[\AhKyhBhNajpc?`<sZU>HfBoPQSqS_fqLZCa
  458. MKr\OhAB^cA=WZGtM_HLbgZgEHlPoMv]TZaBL\];nB>jyMjAoXoTsXk=\QcNa
  459. MTJVHVqy?HFz`Ew<eD\QSebdzeg?FKraE=[wZAL=tpOw[GswoZ\VOcgL^Bzcv
  460. MpqOsKAY^rp`EcBT@<;m>hF@`NU>XXj\Dycz;\`FYgEuCDqUyWZzJ>lecB=Ez
  461. MtW\@?uNB`NvYQxlF`WyBE<^Id<@yzdYSrDfSqRWj>QrIrAMq`ejztRDuU@]w
  462. Mo[R;QNpKxjqV@>yT``BZ;[uwf^D?\I;LzRHmVqvVxVtAY[GYMO\Tar[eAuyD
  463. Mt[`MwzF?CZdhND>y;HtgzDMZ<nFULREdVWtikLpyiBnM;JzPrz???ySNxkBo
  464. M[;iF[jJl<vFze_]vyeiLPKf>XqDV`JuUbtPIHeDspnpxnCX_uiBzvTj=yvNo
  465. MYmzy]S_vH=j<a^_HloumksCF\bu=PtS=hhzd<nLFxXkIQ@h>SeXizfL_oKKO
  466. MRsRwfaqKzGbAzg\UAej@XHzWGeleJE`gmSXgAaQ_WJY<CGUd[e<v\KBPnMHW
  467. M\e`lc?`<gPpb`ko_K@SUfCRU=khE@WIxW`DAO=fqd_E\Jr_VEcig<RkUqPdZ
  468. MY>vam\kzWlBU=Crz\]VGJtqAq@_p`P[LRl<^Igt>p>hXSyD[Z@XOlHb[Hq@^
  469. MLSenuhLXsVVYbf]bcpoVb@r_kk@rDbrw?gEv>;aROj^iK]Zz=Q_yDP@pLXNN
  470. MdMSooRYudGh?kFMQie`zW>z?AlVg>EAgfgphVA>\GYJ\ZtM]CnQZ[cK;AqWZ
  471. MxPEcyLqDP]kOgaAglAwybmUcnS<DPKHvdJempRIEQeepE``bdSKDWwg?^iXp
  472. MltYu@zQWUE\qfyLdmu;QUZogzSPqfcMyijti\H_F[y?Q^_J>NK\LgAt\;H;C
  473. MqwcJZv^QA@Y>bEH^jKmWg^<<sCTf^BEEWkFyYQTo@cZiUEiFRbtNslEXGabS
  474. MzLxucKJtXNIXI?P\tQXjk?sR]TZGmATKoqDYi@\yPGE@tBnGbo<sdK;KK?YN
  475. MZLl?yNn\qyvF>\BcLw\WTpfl_RCclMWOOFQzIvuxhxuHJY@b[LZEc]LOEsLJ
  476. M[WVMvVXOAatAMB@IaVeP[mUg=vf?eq`sSj@PZVf]E@lT_AZJ`VooMwm<DdQP
  477. MHCGuGIXkRZK>en[lAKQ@xBRGGjM<J[kSAfYDBQZOf;WPRJ`Cz;EEvKMppfAz
  478. MlCPJMklQGNGuPbfX]YMtbQFgwZbyE?>y?Fh]?zCXmXBzE^lM=QgMDU\vzaja
  479. McCvhj<?Fg]zvWM^A>eBZFu?UAjt;hGiCFXoc_QKbqI;mLPKKtRXPuh_yrnqM
  480. MOcdHvnOR[Ssf_^K^jnUA[GP\<UUjemGHyk?CpAa=eb`^d^ae[NjVHZJKZMML
  481. MsQwZRT_pQTkTpN]JN[uEsSL=p<TAa=@>>yZfAtWgYdMgzCVaxEcoxJgRvXTF
  482. MqORh@ZcaQ[zC?QtDPVGk=iigAhHkuIjRApE;OPbMftB=efjQ=bnbc@axpHTJ
  483. McewUZAVM]cXCoWaAlWkPDHVs?Dgvw^SQ;bh[VWS>mUGk[Gq@phwRI\YWlFZF
  484. MaXbdf?ApGNCOVeuAVy<UJvFGJLtlaLizajO\@`OjWiYd>B[cqsrd_=uGapX>
  485. MGLG;<]OsdevhSv=?VGGCyTm`Q<pTywd^nm@]joB>\vW_hat^h>>oLcUjYNn?
  486. Mj]NcK??IouIHEhe`]_yliARtzrDTpqt@]WxbUo>\]fLNUjh`zmphigdShoqJ
  487. Mp[?tMU``xz\>n?xNERqeqApAsWr_BXA`syw\gyzUDz]P]mWsyJ`Oq;^\b>Pc
  488. MOy>e?ZQMTcgkAprvZR>Su?TYp=HEq^zKR@JzjeaXiuldj?pjkh;zZ;yM^VC<
  489. MefkwrfD`z`[`Ib>AC>Yoo_ZBZh>MCkvlX`yZ]mzVJLX>?mlWw^Sn>jnypfLJ
  490. MpBc^GCwy\XvY[CGwJSLrsHL=R?KWrVTxuBzCyCgJXY>RnF[Z=mU;pSiHp>?W
  491. MRG@@^_Lj]t[x_KnwqtavKkIhEr=utSHZhhnmA_YKJ;?pEIukuzAGOjduFECl
  492. MJrECF>g;lZxJrEx_lrwYwOq^gi`IlwS]^n@bab<O<hb[euPejbSCE<durnsf
  493. M;rihPql_QP^fW`?YR>Yaaa\opd=YIeVh;A<RwUgKUyO`T?j\Px]adsuDiwMX
  494. Mmf`JGfc?^nBCgVmLfPXrMlhbXsj>KVyoT<Kq@quKhYw@lSZrXsLDbVkNOKDB
  495. MA;jBcNzZcyG><@RlkzkWjm`r>dvuMYs]ygThxN?l]?atrzmOAWUh^Ln=_r?S
  496. MoHT>bD=CpyDN_WpZ;VZK]oC]mZ@rWfbAZ]WXFqOAsmMNzPWf>Utp;v<LmR=E
  497. MUcO<Tn@d\rDmQ\P`_ZnUnp^rzp_MbVy[G_OnVWV<Higob]DuwJn[dR^htuNM
  498. MigNt>;]Vn];KmSDNL\PqvwF`iNjw]bXQkvAbKz?fzBL[dGulSg@N\qQJdDhW
  499. MMYiqYPzAN^yk^VmpfFLpfagj[?H]i;WxXNgcRtqbeEDjdAnfVpSL;MvKZBID
  500. MKV=nVHzHw[Z_ZxADYlo^G;R`u_cWPhy@>gOXx`m@s=g]@T;Vna^P=TvNam<V
  501. M_lRcpFLS\aZK<;b`px<\`eY?=ZawOKWHKBquqDjyOU@NxtYx]h_RW?VB]gsO
  502. Mnh>iO<isyOGcRknn=kqU\Euf_mFY>NLFxxL=WXrdz@YYDu^uXDyNvxX@Me=P
  503. MCmuuD<DbWDRYbZSANXheTafHxDAU=jF>MW\yMNbIW`EFkpFAQcifl^AzgPhi
  504. M\kZlrIF@iqUN_A`zNsT=bZvDWZff\@\HzoeIWk?z@U<YaOZAXLZ;s\U_tE`q
  505. Mw@fGaHoZH`jUQ`WFTb>z^hPG=S^fp<m@s`yAJ`zU\a=ZjlcUAN``xeBJlmQ]
  506. MxAgFGM<CnnICt\k=ElkbeCr[R^YvDkRVWNO\?zgnvqUV;PwDbtM\`x@Y<@H]
  507. M?ii\ih;C<E]RsyVYfLe;Mmn>NoSMueuXboREM=@]?mmmKp_dgEcOwKeAYOBB
  508. MAqsy;edsof_uQ^=vXt[dmBJ_SMWfRc?wFChTDFnbdF<n^HY`x`c@nCGnm]oZ
  509. M]<^KPG<WvLtMfURPyYYoHS=bTXhGpiF\F[[udxZ=OP]Se=xMgg[g`lq[MXP;
  510. MzRfADdvR;Kf^zCyNMe=hJR^\EfYYQJmVTFuiPLAsc_CNqHW>?=uSbAUlTdWf
  511. MjsF[VZFZqEbLEr;HOE[CajgZU?aJkufzx^^lXIJf[Bk`B<jXpRpN]Jt>`ZJ<
  512. M\MbD@\aANIOIzDVoYqupNFq;UB@FHOFGnCKArZFuAN]uxNGgk^_s]UkWVC\d
  513. M;VEW^@Iy@nrIex>PA@f;b>zMnS[ED^Fp_uJ>mm>wkobWVphKBUfvUzPZ`wVF
  514. M?=gooMy\?rTHgY\ESZWRNiMzUKqRvHCUsn`IKgg@fzwFq[bL_>Vs^IOHT\rm
  515. MjcMwSoCuyBEYdRXH>e\aD>UUxewWE@YdX]m>Cate;=rh]fVZ`ZeAipuD\kWc
  516. MZYXuoiawHI<GfNRIn@<JfS]MFQYCh?wUGf;[iMSSfwtSVrBQu?WU`UxT@HJZ
  517. MokLHtw<qP@Ky^jOltv?lKyi?s>@wts@PWhXWGuABDRcYD>IZDlk[oGOntrgn
  518. Myg=oOCjHMNm^PRD]qDC>tVEDd^z`HJXhdmUMLBqIArW]bp<AyKnzq@IDq<c=
  519. MvfS>SQP@RjY;OO?=fUBmplSr`w]KMnn[WziJ?CIy_Tt^mpIdOksmUwkJSJCZ
  520. Myhr[CvxrKK\\;T?rF^qCub]=GJ[b=QOVsFmP=`XmC>=;dU?X<AyQKUm]wta`
  521. MRPAnMnklmmifz@duKXsAL`pHEy@ZgpzXG[sn;Jah;S\[@Ct@JXhafAUkiWhG
  522. M^fduxkgGDS_<NSIYjSqei;V@BcGAt<YYrR\RR;>@g[KiXaSh?KSgT?;o`qgc
  523. MH>BJQQJpATGts[VzTmK>R]tjVC@cn<lJQIdVyXWYlwS@LrMo]YYyMToUNSKR
  524. MUqG_i]EeGk^whBPuYOPJcYg\<yNterwZYymASKz<Z\jHyeDrNJCqMLdgwNle
  525. Mz@PpTEaERPnDpNcL;@XvFmL[siB@OCiXZvr?gYtRXmnrW]n@mbNi<?h>fPIT
  526. MptNCmhSeOGd@PWxRVm\UGXV;Fr\NY@MOqP_C\qWEsmItgMKxD<YB><_moGYO
  527. MeABQyOTLgpvdC]ke]OLBF?tC\U>FlGxCDZ@Ulu;lSpjL\heBvGwKMvXvmI>h
  528. MTGolWIyBDHfYr=alti`;<<yven;fQ[TR>Apjq>gpaLoR>YKiJEo]xJ@o`kLE
  529. MO^hUO=kV<qiIa;hd`BjVR\]\Swz<jUlqoL`vpnosnjN]xbugK?bZnbb<]T;n
  530. M=G>OH<t@=va@A<O^sHKHC=AZJOFPsoFJ?AEhPEPb^XJl`<mJYm;KX?FpUoAI
  531. MIES>Hc\iirWbbnz?MTYAlLYWXEMwC]_CnLmRYK@ZRPh@`CEZ;L;[v__oUmUl
  532. MOU[q]c_E@C[TZblMerKPYQCi<eF]Fb`?rIUBYZtINHGAihT[^hyvQqemcKQl
  533. M[AxcsxHYhnqX@NFNC[WCJ]P?;zt>tEVRNNda^fYZ;yQHJr<h_mDIokPlLcRf
  534. M^jBMkb\`pD[KRLMekxGl<?SuGg^q?PxBOfVjbkfcsrdRzhsj@NnJR_mWAOkZ
  535. MkjMNo<YsvMgRbLxgQKCAsUZTnhYWtarFyvyE][yjp^rZncTaLNpp>xZRFf^p
  536. MG@RDgWLW=RPrxcbebh<xQn?qOtaE_\ZcDOVjJC;qj[shR=bys[bWeoEHfoFE
  537. MnyB@HwCfiHrHgHKI<OzXpEZV>BGtAEt;UQFOlLfiUqqua=RaUsYhpD[zMY;O
  538. MqJaiCPmF?>[>`ZPjL\rw<SUseJBqljBoSixdq`KnZXDZ=RvXjPX>]ITPjERn
  539. MY[Am[UHQLi;iZ_BmtrUXCGY``NZgXbKVPUBANPkHUZ_?G[cG>pZtjCL\fKKf
  540. M_Z>OG?>v^sh;Nypa=jBH[rhvkl_QNYGzJmuqImwDr^S=X^RHc<ti`YoN\Gir
  541. MosgtCCH<hDZVwFarPZpAb<lOar[CBnV??JFqQB^w=[u;HatlOjlZ[ftEWSfc
  542. M@TnISBzsxJVk`sptbXWUSXd>G_uyeG\eyc@r]naxBEjPR[CIqn];eJmSQnVA
  543. M??S^ZOukR[Zg<^orQsg<TewdyREr=T\Zu\IKPdy]nCLD=XpEMYD>FMVbwb;D
  544. MtLCN_jS>gHrcnOmAhqTceSkal<RMLD?FaKZl<rLY\xBT[SDZG\WeQwuqzq_V
  545. MFt\Y@IRPdpeE<SmcR^MAT]bTqolj[ZBN<WtJnAR=Mk<iemzKipRenWlHru^t
  546. MC]jD[xYL]UgDPRb[==GjHknkIviBsHrPo^ZHaVYTHg_E@cG@cc;_VO@c<Qmx
  547. MN>yQN=KdSARRvQcMs=ouL?SRMhafmouYi>Kd`jFLu>IRBsk?a@p=auTQ]pke
  548. Mn<kCjXGyVUOlbIC`v_UOfRtfhBXAO@Y@ESLd[mujy[uoYCBF[vxuFaJqbEVr
  549. MDHVL;\zwYSQCKtuNWU]e>Heetx=zylTPF?eIM?fjCgoNbUYwmH]L>?r[>EEy
  550. kiJJTGLzjRoS[@`a
  551. `
  552. end
  553.  
  554. ************** TEST VECTORS ***********************************
  555.  
  556. This is a test vector.
  557. Plaintext is "BLOWFISH".
  558. The key is "abcdefghijklmnopqrstuvwxyz".
  559.  
  560. #define PL 0x424c4f57l
  561. #define PR 0x46495348l
  562. #define CL 0x324ed0fel
  563. #define CR 0xf413a203l
  564.         static char keey[]="abcdefghijklmnopqrstuvwxyz";
  565.  
  566. This is another test vector.
  567. The key is "Who is John Galt?"
  568.  
  569. #define PL 0xfedcba98l
  570. #define PR 0x76543210l
  571. #define CL 0xcc91732bl
  572. #define CR 0x8022f684l
  573.  
  574.  
  575.